'use strict'

/**
 * <--    还原前    -->
var a = 123,b;

let c = 4 + 5;

d = a + 12;
 * 
 * <--    特点    -->
 * 有些变量声明之后再也没有使用过（无引用，无重新赋值），就是僵尸声明，阻碍阅读，运行时浪费内存
 * 直接移除这部分僵尸声明
 * 
 * <--    解决办法    -->
 * 由VariableDeclarator进入path，获取到binding，利用binding.constant, binding.referenced判断是否该删除
 * 
 * <--    冗余判断    -->
 * 1. 变量声明
 * 2. 无引用(RValue，变量a在位置4000h中存储的值，32h（数字50），或8000h（指向堆地址）)
 * 3. 无赋值(LValue，变量a在内存中的位置4000h)
 * 
 * <--    还原后    -->
var a = 123;
d = a + 12;
 * 
 * 
 **/

const {parse} = require('@babel/parser');
const traverse = require('@babel/traverse').default;
const t = require('@babel/types');
const generator = require('@babel/generator').default;

let xcode = `var a = 123,b;

let c = 4 + 5;

d = a + 12;`;

const visitor = {
    VariableDeclarator:{
        enter:function(path){
            let binding = path.scope.getBinding(path.get('id').node.name);
            if(!binding){return}
            if(!binding.constant){return}
            if(binding.referenced){return}
            path.remove();
        },
    },
}

const ast = parse(xcode);
traverse(ast, visitor);
let {code} = generator(ast, {retainLines:false, comments:false});
console.log(code);


